package com.dc.ai.config;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import org.springframework.ai.chat.messages.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class MessageDeserializer extends StdDeserializer<Message> {

    public MessageDeserializer() {
        this(null);
    }

    public MessageDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Message deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        JsonNode node = jp.getCodec().readTree(jp);

        String text = node.has("text") ? node.get("text").asText() : "";
        
        // 优先从role字段获取角色，如果没有则尝试从messageType字段获取
        String roleStr;
        if (node.has("role")) {
            roleStr = node.get("role").asText();
        } else if (node.has("messageType")) {
            roleStr = node.get("messageType").asText();
        } else {
            // 如果都没有，默认为USER
            roleStr = "USER";
        }
        
        // 添加角色字符串规范化处理
        roleStr = roleStr.toUpperCase();
        
        // 添加日志输出，帮助调试
        System.out.println("反序列化消息，角色: " + roleStr + ", 内容: " + text);
        
        MessageType role;
        try {
            role = MessageType.valueOf(roleStr);
        } catch (IllegalArgumentException e) {
            // 如果角色字符串无法解析，默认为USER
            System.out.println("无法解析角色: " + roleStr + "，使用默认角色USER");
            role = MessageType.USER;
        }

        // 处理元数据
        Map<String, Object> metadata = new HashMap<>();
        if (node.has("metadata") && node.get("metadata").isObject()) {
            JsonNode metadataNode = node.get("metadata");
            metadataNode.fieldNames().forEachRemaining(fieldName -> {
                metadata.put(fieldName, metadataNode.get(fieldName).asText());
            });
        }

        // 根据角色创建不同类型的消息 
        Message message;
        switch (role) {
            case ASSISTANT:
                message = new AssistantMessage(text);
                break;
            case SYSTEM:
                message = new SystemMessage(text);
                break;
            case USER:
            default:
                message = new UserMessage(text);
                break;
        }

        // 如果有元数据，添加到消息中
        if (metadata != null && !metadata.isEmpty()) {
            for (Map.Entry<String, Object> entry : metadata.entrySet()) {
                message.getMetadata().put(entry.getKey(), entry.getValue());
            }
        }
        return message;
    }
}